package top.arryweb.application.common.utils;

import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils;

/**
 * @Description 日期工具类
 * @Author mac
 * @Date 2021/6/19
 **/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

  public static String YYYY = "yyyy";

  public static String YYYY_MM = "yyyy-MM";

  public static String YYYY_MM_DD = "yyyy-MM-dd";

  public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

  public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

  private static String[] parsePatterns = {
      "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
      "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM",
      "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyy/MM",
  };

  /**
   * 获取当前Date型日期
   *
   * @return Date()当前日期
   */
  public static Date getNowDate() {
    return new Date();
  }

  /**
   * 获取当前日期，默认格式为yyyy-MM-dd
   *
   * @return String
   */
  public static String getDate() {
    return dateTimeNow(YYYY_MM_DD);
  }

  public static String getTime() {
    return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
  }

  public static String dateTime(final Date date) {
    return parseDateToString(YYYY_MM_DD, date);
  }

  public static String dateTimeNow() {
    return dateTimeNow(YYYYMMDDHHMMSS);
  }

  public static String dateTimeNow(final String format) {
    return parseDateToString(format, new Date());
  }

  public static String parseDateToString(final String format, final Date date) {
    return new SimpleDateFormat(format).format(date);
  }

  public static Date dateTime(final String format, final String ts) {
    try {
      return new SimpleDateFormat(format).parse(ts);
    } catch (ParseException e) {
      throw new RuntimeException(e);
    }
  }

  /**
   * 日期路径 年/月/日
   */
  public static final String datePath() {
    Date now = new Date();
    return DateFormatUtils.format(now, "yyyy/MM/dd");
  }

  /**
   * 日期路径 年月日
   */
  public static final String dateTime() {
    Date now = new Date();
    return DateFormatUtils.format(now, "yyyyMMdd");
  }

  /**
   * 日期型字符串转化成日期格式
   */
  public static Date parseDate(Object str) {
    if (str == null) {
      return null;
    }
    try {
      return parseDate(str.toString(), parsePatterns);
    } catch (ParseException e) {
      return null;
    }
  }

  /**
   * 获取服务器启动时间
   */
  public static Date getServerStartDate() {
    long time = ManagementFactory.getRuntimeMXBean().getStartTime();
    return new Date(time);
  }

  /**
   * 计算相差天数
   */
  public static int differentDaysByMilliseconds(Date date1, Date date2) {
    return Math.abs((int) ((date1.getTime() - date2.getTime())));

  }

  /**
   * 计算两个时间差
   * @param endDate
   * @param nowDate
   * @return
   */
  public static String getDatePoor(Date endDate, Date nowDate) {
    long nd = 1000 * 24 * 60 * 60;
    long nh = 1000 * 60 * 60;
    long nm = 1000 * 60;

    //获得两个时间的毫秒时间差异
    long diff = endDate.getTime() - nowDate.getTime();
    //计算差多少天
    long day = diff / nd;
    //计算差多少小时
    long hour = diff % nh / nd;
    //计算差多少分钟
    long min = diff % nh % nm / nd;
    return day + "天" + hour + "小时" + min + "分钟";

  }
}
